package algo.A01_位运算;

/**
 * 给定一个介于0和1之间的实数(0.625)，类型为double，打印它的二进制表示。
 * 如果该数字无法精准地用32位以内的二进制表示，则打印“ERROR”。
 * 例如：0.625用二进制表示为0.101，
 * 因为小数点后的二进制位分别表示0.5,0.25,0.125...，每多一位就除以2
 * 所以0.625 = 0.5 + 0.125，即0.101
 */
public class T06_0到1之间浮点实数的二进制表示 {
    public static void main(String[] args) {
        double float_number = 0.2;
        solution(float_number);
    }

    /**
     * 解题思路：每次乘以2，取整数部分，取完后整数部分归0，
     * 继续乘以2，取整数部分，直到乘以2后结果为0
     *
     * @param f
     */
    private static void solution(double f) {
        //使用StringBuilder来拼接字符串
        StringBuilder result = new StringBuilder("0.");
        //当浮点数不等于0且拼接长度小于等于32时执行循环
        while (f > 0 && (result.length() - 2 <= 32)) {
            double temp = f * 2;
            if (temp >= 1) {
                result.append("1");
                f = temp - 1;
            } else {
                result.append("0");
                f = temp;
            }
        }
        //输出结果
        if (result.length() - 2 <= 32){
            System.out.println("result = " + result.toString());
        }else {
            System.out.println("result = ERROR");
        }
    }
}
